Technical Q&A
TB 60 -
複数のコードフラグメントを持つコンテクストメニュープラグイン(1999
年 4 月 5 日)
Q:
これまで正常に動作していたコンテクストメニュープラグインが、2
つ目のコードフラグメント (私の場合はアプリケーションです)
をファイルに追加した結果、正常に動作しなくなりました。メニューの中に、同じメニュー項目が
2
つ現れてしまいます。そのプラグインを調べてみると、Initialize、ExamineContext、PostMenuCleanup
の各メソッドが 2
回呼び出されていることがわかりました。どういうことでしょうか?
A: メニューマネージャの 'cfrg'
リソースパーサがやや不完全なことが原因です。「cfrg」リソースパーサは、ファイル中の各プラグインをインスタンス化しようとするときに、最初のプラグインだけを繰り返しインスタンス化してしまいます。このため、複数のプラグインを作成する必要がある場合は、プラグインファイルも複数作成する必要があります。通常はメニュー項目
1 つに対して個別にフラグメントを作成するよりも、1
つのフラグメントで複数のメニュー項目を追加するほうが簡潔なため、この問題に影響を受けるデベロッパはさほど多くはないはずです。
ご質問のケースでは「複数のメニュー項目やプラグインがほしい」というわけではなく、ただ単に「コードフラグメントを複数利用したい」ということですから、次のようなコードを使えば問題を回避できます。
static MyPlug *gMyPlugInstance; // Radar 1663652 の回避策
OSStatus MyPlug::Initialize (Environment *, FSSpec *)
{
if (!gMyPlugInstance)
gMyPlugInstance = this;
return noErr;
}
OSStatus MyPlug::ExamineContext
(Environment *, AEDesc *aeContext, SInt32 timeOut,
AEDescList *commandList, Boolean *needMoreTime)
{
OSStatus err = noErr;
*needMoreTime = false;
if (gMyPlugInstance == this)
{
if (aeContext)
{
// コンテクストを判断し、適切な場合はメニュー項目に追加
}
}
return err;
}
-- Pete Gontier
Worldwide Developer Technical Support
Technical Q&As | Contents
Previous Question | Next
Question
To contact us, please use the Contact
Us page.
|